//################################################################################
// MIT License
// Copyright (c) 2024 ZhangYihua
//
// Change Logs:
// Date           Author       Notes
// 2020-04-14     ZhangYihua   first version
//
// Description  : convert one-hot number to binary number
//################################################################################

module onehot2bin #(
parameter           OH_BW                   = 8,            // bit width of one-hot number

// the following parameters are calculated automatically
parameter           BIN_BW                  = $clog2(OH_BW) // bit width of binary number
) ( 
input               [OH_BW-1:0]             oh,             // one-hot number or all zero
output              [BIN_BW-1:0]            bin             // binary number
);

//################################################################################
// define local varialbe and localparam
//################################################################################
wire                [BIN_BW*OH_BW-1:0]     idx;

//################################################################################
// main
//################################################################################

genvar g0;
generate for (g0=0; g0<OH_BW; g0=g0+1) begin:G_OH_BW

    // generate all binary numbers within range
    assign idx[BIN_BW*g0+:BIN_BW] = $unsigned(g0);

end endgenerate

// select right binary number according to one-hot number
n2o #(
        .PNUM                           (OH_BW                          ),	// source port number
        .DWID                           (BIN_BW                         ),	// data width of one port
        .SMODE                          ("ONEHOT"                       ) 	// sel is onehot signal
) u_n2o ( 
        .sel                            (oh                             ),
        .np_dat                         (idx                            ),
        .op_dat                         (bin                            )
);

endmodule
